package com.sojson.base.impl;

import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;

import com.sojson.base.BaseDao;
import com.sojson.util.page.PageUtil;

/**
 * Mapper映射基础实现类(目的:把分页插件从Service层分离,这样就不用每次调Dao接口都要分页)
 * 
 * @author liu
 * @date 2020-08-17
 */
public class BaseDaoImpl<Dao extends BaseDao<?>, Dto extends BaseDto> implements BaseDao<Dto> {

    @Autowired
    protected SqlSessionTemplate sqlSessionTemplate;

    /**运行时实体Bean实例*/
    private Class<Dao> daoClass;
    /**class全名称 用于构造缓存Key*/
    private String className = "";

    /**
     * 默认构造函数
     */
    @SuppressWarnings("unchecked")
    protected BaseDaoImpl() {
        daoClass = (Class<Dao>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        className = daoClass.getName();
    }

    /** 设置请求分页数据(默认有分页)  */
    protected void startPage(BaseDto baseDto) {
        PageUtil.startPage(baseDto);
    }

    /** 设置请求分页数据(默认查所有) */
    protected void startPageAll(BaseDto baseDto) {
        PageUtil.startPageAll(baseDto);
    }

    /** 设置请求分页数据(默认有分页,默认按ID降序排序)  */
    protected void startPageDefaultSort(BaseDto baseDto) {
        PageUtil.startPageDefaultSort(baseDto);
    }

    /** 设置请求分页数据(默认查所有,默认按ID降序排序) */
    protected void startPageAllDefaultSort(BaseDto baseDto) {
        PageUtil.startPageAllDefaultSort(baseDto);
    }

    /**
     * 单条插入
     * 
     * @param dto
     * @return
     */
    @Override
    public int insert(Dto dto) {
        return sqlSessionTemplate.insert(className + ".insert", dto);
    }

    /**
     * 批量插入
     * 
     * @param list
     * @return
     */
    @Override
    public int insertList(List<Dto> list) {
        return sqlSessionTemplate.insert(className + ".insertList", list);
    }

    /**
     * 通过对象批量删除(物理删除)
     * 
     * @param dto
     * @return
     */
    @Override
    public int deleteByDto(Dto dto) {
        return sqlSessionTemplate.delete(className + ".deleteByDto", dto);
    }

    /**
     * 统计全部数量
     * 
     * @return
     */
    @Override
    public int countAll() {
        return sqlSessionTemplate.selectOne(className + ".count");
    }

    /**
     * 查询所有
     * 
     * @return
     */
    @Override
    public List<Dto> listAll() {
        return this.sqlSessionTemplate.selectList(className + ".listAll");
    }

    /**
     * 根据对象统计数量
     * 
     * @param dto
     * @return
     */
    @Override
    public int countByDto(Dto dto) {

        return sqlSessionTemplate.selectOne(className + ".countByDto", dto);
    }

    /**
     * 根据对象查询
     * 
     * @param dto
     * @return
     */
    @Override
    public List<Dto> listByDto(Dto dto) {
        startPage(dto);
        return this.sqlSessionTemplate.selectList(className + ".listByDto", dto);
    }

}